package exam;

/**
 * 在日常开发中，我们经常会用的有2进制、10进制、16进制，A系统需要一个进制转换功能，请实现10进制与任意进制（进制36以内）互转函数。
 * 提示：进制数据中0~9用字符0'~9'表示，10用‘A表示，11用B表示，以此类推，35用Z'表示。
 * 输出要求：
 * （1）输出10进制100转36进制的值：
 * （2）输出10进制100转27进制的值：
 * （3）输出27进制1A1转10进制的值。
 * （4）输出36进制1A1转10进制的值。
 * 注：禁止使用开发语言自带的进制转换函数，要自己编码实现逻辑。另外在函数编码之前可以用注释说明自己的逻辑思路。
 */
public class 进制转换 {

    public static void main(String[] args) {
       /* Scanner sc = new Scanner(System.in);
        System.out.print("请输入2个数字，以空格分开（第1位是待转进制，第2位是需转换的十进制数字）：");;*/
        int bin = 16;
        int num = 200;
        if (bin < 2) {
            System.out.println("待转进制必须大于1");
            return;
        }
        String a = switch10ToN(bin, num);
        System.out.println("十进制的数字 " + num + " 转换至" + bin + "进制后的数字为：" + a);

//        System.out.print("请输入2个数字，以空格分开（第1位是需转换的进制数字，第2位是当前进制）：");

        int res = switchNto10(bin, a);
        System.out.println(bin + "进制的数字 " + a + " 转换为十进制为：" + res);
    }

    private static String[] num = ("0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q" +
            ",r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z")
            .split(",");

    /**
     * 10进制转N进制
     * 1）整理将要转换的进制字母对应表
     * 2）利用栈先进后出的特点   创建栈Stack
     * 3）栈中存放 余数对应的进制字母，即  s.push(digths.charAt(num % base))
     * 4）num递除  num /= base;
     * 5）栈不为空  弹出 stringbuilder接收 sb.append(s.pop());
     * 6）返回 stringbuilder.toString()
     *
     * @param base 待转换进制
     * @param num  10进制数
     * @return
     */
    public static String switch10ToN(int base, int num) {
        StringBuffer sb = new StringBuffer();
        String all = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        //将要转换的进制字母对应表
        String digths = all.substring(0, base);
        //只能装字符型的栈
        while (num != 0) {
            sb.append(digths.charAt(num % base));
            num /= base;
        }
        return sb.reverse().toString();
    }

    /**
     * N进制转10进制
     * 1）整理将要转换的进制字母对应表
     * 2）将字符串数值 反转
     * 3）遍历字符串数值 获取对应的字母 下标
     * 4）result += index * Math.pow(base, i)
     *
     * @param base N进制
     * @param num  数值
     * @return
     */
    public static int switchNto10(int base, String num) {
        int result = 0;
        String all = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String digths = all.substring(0, base);
        StringBuilder sb = new StringBuilder(num);
        num = sb.reverse().toString();
        for (int i = 0; i < num.length(); i++) {
            int index = digths.indexOf(String.valueOf(num.charAt(i)));
            result += index * Math.pow(base, i);
        }
        return result;
    }

}